import axios from 'axios'
import store from '@/store/'
// import { getToken } from '@/utils/auth'
import router from '@/router/index'
import NProgress from 'nprogress' // progress bar
import { Message } from 'element-ui'
import { Loading } from 'element-ui'

import sdk from '@/utils/common'

axios.defaults.timeout = 1000 * 100
// 跨域请求，允许保存cookie
axios.defaults.withCredentials = true
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8'// 配置请求头

import permissionSdk from '@/utils/permission'

NProgress.configure({
  //禁用进度环
  showSpinner: false,
})

// 记录和显示错误
function printErrorLog (error) {
  // 打印到控制台
  if (process.env.NODE_ENV === `development`) {
    console.log(`【Villa】错误信息 >>${ error}`)
  }
  // 显示提示
  Message({
    message: error.message,
    type: `error`,
    duration: 5 * 1000,
  })
}

axios.interceptors.request.use(config => {
  // doSomething
  const token = store.state.user.token || JSON.parse(sessionStorage.getItem(`token`));
  const userId = store.state.user.userId || JSON.parse(sessionStorage.getItem(`userId`));
  if (sdk.judgeNull(token) && sdk.judgeNull(userId)) {
    config.headers[`userId`] = userId
    config.headers[`token`] = token
    config.headers[`sdpc-token`] = token
    config.headers[`app`] = `123456`
  }
  return config
}, error => {
  return Promise.reject(error)
})

//【response】拦截器,响应并反馈结果以后的处理
axios.interceptors.response.use(res => {
  const status = res.data.code || 200
  const message = res.data.msg || res.data.message || `未知错误`
  if (res.request.responseType === `blob` && res.status === 200) {
    return res.data
  }
  if (status.toString().indexOf(`200`) >= 0) {
    if (status != 200 && status != 200601 && status != 200616 && status != 200621 && status != 200622 && status != 200619 && status != 200624 && status != 200625) {
      let errorMsg=``
      switch (status) {
      case 500602: errorMsg = `解析Json参数失败，请检查参数格式！`; break
      case 500603: errorMsg = `查询必要参数缺失，请检查！`; break
      case 500605: errorMsg = `内部错误！`; break
      case 200606: errorMsg = `访问频繁，请稍后再试`; break
      case 200607: errorMsg = `token为空`; break
      case 200608: errorMsg = `app为空`; break
      case 200609: errorMsg = `userId为空`; break
      case 200610: errorMsg = `登陆已经失效，请重新登陆！`; break
      case 200611: errorMsg = `用户信息不一致，请检查传输参数！`; break
      case 200612: errorMsg = `没有访问数据中心权限，请联系管理员`; break
      case 200613: errorMsg = `没有访问接口权限，请联系管理员`; break
      case 200614: errorMsg = `验证码输入错误！`; break
      case 500614: errorMsg = `对象解密失败，内部错误！`; break
      case 500615: errorMsg = `未检索到该用户信息！`; break
      case 200617: errorMsg = `用户无登录该系统权限，请联系管理员！`; break
      case 500618: errorMsg = `密码错误，用户验证失败！`; break
      case 200619: errorMsg = `退出成功！`; break
      case 500620: errorMsg = `token删除失败！`; break
      case 500623: errorMsg = `操作失败！`; break
      case 500625: errorMsg = `数据非空验证失败！`; break
      case 500631: errorMsg = `身份证号已存在！`; break
      case 401: errorMsg = `登陆已经失效，请重新登陆！`; break
      default: break
      }
      Message({
        message: errorMsg,
        type: `error`,
      })
      if (status == 401||status == 200607||status == 200608||status == 200609||status == 200610||status == 403||status == 200619) {
        // localStorage.clear();
        sessionStorage.clear()
        router.push({ path: `/login` })
      }
      return Promise.reject(new Error(message))
    }
  }
  else {
    if (status == 401||status == 200607||status == 200608||status == 200609||status == 200610||status == 403) {
      // localStorage.clear();
      sessionStorage.clear()
      router.push({ path: `/login` })
    }
    Message({
      message: message,
      type: `error`,
    })
    return Promise.reject(new Error(message))
  }
  return res.data
}, error => {
  if (error && error.response && error.response.code) {
    switch (error.response.code) {
    case 400: error.message = `400 Bad Request：请求出现语法错误。`; break
    case 401: error.message = `401 Unauthorized：登录状态已经失效，请重新登录`; break
    case 403: error.message = `403 Forbidden：资源不可用。服务器理解客户的请求，但拒绝处理它。通常由于服务器上文件或目录的权限设置导致。 `; break
    case 404: error.message = `404 Not Found：无法找到指定位置的资源。这也是一个常用的应答，HttpServletResponse专门提供了相应的方法：sendError（message）: ${error.response.config.url}`; break
    case 405: error.message = `405 Method Not Allowed：请求方法（GET、POST、HEAD、DELETE、PUT、TRACE等）对指定的资源不适用。 `; break
    case 406: error.message = `406 Not Acceptable：指定的资源已经找到，但它的MIME类型和客户在Accpet头中所指定的不兼容。 `; break
    case 407: error.message = `407 Proxy Authentication Required：类似于401，表示客户必须先经过代理服务器的授权。 `; break
    case 408: error.message = `408 Request Timeout：在服务器许可的等待时间内，客户一直没有发出任何请求。客户可以在以后重复同一请求。`; break
    case 416: error.message = `414 Request URI Too Long：URI太长。 `; break
    case 500: error.message = `500 Internal Server Error：服务器遇到了意料不到的情况，不能完成客户的请求。`; break
    case 501: error.message = `501 Not Implemented：服务器不支持实现请求所需要的功能。例如，客户发出了一个服务器不支持的PUT请求。 `; break
    case 502: error.message = `502 Bad Gateway：服务器作为网关或者代理时，为了完成请求访问下一个服务器，但该服务器返回了非法的应答。 `; break
    case 503: error.message = `503 Service Unavailable：服务器由于维护或者负载过重未能应答。例如，Servlet可能在数据库连接池已满的情况下返回503。服务器返回503时可以提供一个Retry-After头。`; break
    case 504: error.message = `504 Gateway Timeout：由作为代理或网关的服务器使用，表示不能及时地从远程服务器获得应答。 `; break
    case 505: error.message = `505 HTTP Version Not Supported：服务器不支持请求中所指明的HTTP版本。`; break
    default: break
    }
    if (error.response.code == 401 || error.response.code == 200607 || error.response.code == 200608 || error.response.code == 200609 || error.response.code == 200610) {
      if (!flag) {
        router.push({ path: `/login` })
      }
    }
  }
  //打印并弹出错误信息
  printErrorLog(error)
  return Promise.reject(error)
})


export default axios
